/**
 * IndexedDB 存储类型定义
 *
 * 本文件定义IndexedDB存储所需的所有类型接口
 */

import { Content, ContentType, ContentStatus } from '../../../types/document'

/**
 * StoredDocument - documents表存储结构
 *
 * 重要: 直接存储完整的Content对象,保持与v1.0完全兼容
 */
export interface StoredDocument {
  // 基础字段
  id: string                          // 主键
  type: ContentType                   // 内容类型
  title: string                       // 文档标题
  description?: string                // 描述
  status: ContentStatus               // 状态
  tags: string[]                      // 标签
  metadata: Record<string, any>       // 元数据

  // 时间字段 - 保持ISO字符串格式(与v1.0一致)
  createdAt: string                   // ISO时间字符串
  updatedAt: string                   // ISO时间字符串

  // 类型特定数据 - 完整的data字段
  data: any                           // TextDocumentData | StoryboardData | DataCollectionData

  // 内部索引字段(仅用于查询优化,不影响业务逻辑)
  _searchTitle: string                // 小写标题,用于搜索
  _updatedAtTimestamp: number         // 时间戳,用于排序
}

/**
 * DocumentVersion - versions表存储结构
 * 用于存储文档的历史版本
 */
export interface DocumentVersion {
  id: string                          // 版本ID (主键)
  documentId: string                  // 关联文档ID
  content: string                     // 版本内容
  diff?: string                       // 增量差异(可选)
  createdAt: number                   // 创建时间戳
  createdBy: string                   // 创建者
  comment: string                     // 版本备注
  tag?: string                        // 版本标签(可选)
}

/**
 * StoredStoryboard - storyboards表存储结构
 * 注意: 当前版本不使用此表,分镜统一存储在documents表中
 * 此表预留给未来扩展使用
 */
export interface StoredStoryboard {
  id: string                          // 主键
  title: string                       // 分镜标题
  description: string                 // 描述
  scenes: any[]                       // 场景列表(预留)
  createdAt: number                   // 创建时间戳
  updatedAt: number                   // 更新时间戳
  metadata: Record<string, any>       // 元数据
}

/**
 * StoredAsset - assets表存储结构
 * 用于存储图片、视频等二进制资源
 */
export interface StoredAsset {
  id: string                          // 主键
  type: 'image' | 'video' | 'audio'  // 资源类型
  name: string                        // 文件名
  data: Blob                          // 二进制数据
  size: number                        // 文件大小(字节)
  mimeType: string                    // MIME类型
  createdAt: number                   // 创建时间戳
  references: string[]                // 引用此资源的文档ID列表
}

/**
 * StoredConfig - config表存储结构
 * 用于存储应用配置
 */
export interface StoredConfig {
  key: string                         // 配置键(主键)
  value: any                          // 配置值
  updatedAt: number                   // 更新时间戳
}

/**
 * 存储使用情况统计
 */
export interface StorageUsageSummary {
  documentsCount: number              // 文档总数
  versionsCount: number               // 版本总数
  assetsCount: number                 // 资源总数
  totalSize: number                   // 总大小(字节)
  byType: {                           // 按类型统计
    [key in ContentType]?: number
  }
}

/**
 * 导出数据格式
 */
export interface ExportData {
  documents: StoredDocument[]         // 文档列表
  config: Record<string, any>        // 配置数据
  exportedAt?: string                 // 导出时间
  version?: string                    // 数据版本
}

/**
 * 辅助函数: 将Content对象转换为StoredDocument
 */
export function contentToStoredDocument(content: Content): StoredDocument {
  return {
    ...content,
    createdAt: content.createdAt.toISOString(),
    updatedAt: content.updatedAt.toISOString(),
    // 添加内部索引字段
    _searchTitle: content.title.toLowerCase(),
    _updatedAtTimestamp: content.updatedAt.getTime()
  }
}

/**
 * 辅助函数: 将StoredDocument转换为Content对象
 */
export function storedDocumentToContent(doc: StoredDocument): Content {
  return {
    ...doc,
    createdAt: new Date(doc.createdAt),
    updatedAt: new Date(doc.updatedAt)
  } as Content
}
